package code07_面向对象.bms;

import java.util.Scanner;

/**
 * @author 黄衡熙
 * @version 1.0
 * @date 2025年07月22日15:14
 */
public class Start {

    private Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        new Start().showMenu();
    }

    public void showMenu() {
        System.out.println("******************欢迎来到紫金银行******************");
        System.out.print("请选择服务(1.开户 2.登录):");
        int choice = sc.nextInt();
        switch (choice) {
            case 1:
                register();
                break;
            case 2:
                login();
                break;
            default:
                System.out.println("提示:您输入的选项有误,已退出");
                break;
        }
    }

    public void register() {
        // 选择需要开户的账户类型
        System.out.print("请选择开户的账户类型(1.储蓄账户 2.信用账户 3.贷款的储蓄账户 4.贷款的信用账户):");
        int choice = sc.nextInt();
        // 准备一个父类,用于指向具体的子类
        Account account = null;
        switch (choice) {
            case 1:
                account = new SavingAccount();
                break;
            case 2:
                account = new CreditAccount();
                break;
            case 3:
                account = new LoanSavingAccount();
                break;
            case 4:
                account = new LoanCreditAccount();
                break;
            default:
                System.out.println("错误:您输入的选项有误,请重新输入!");
                register();
        }
        // 填写开户所需要的信息
        System.out.print("请输入户主姓名:");
        account.setName(sc.next());
        // 准备一个变量,用于接收当前输入次数,超出三次退出系统
        int num = 0;
        while (true) {
            System.out.print("请输入密码:");
            String password = sc.next();
            System.out.print("请再次输入密码:");
            String rePassword = sc.next();
            num++;
            if (password.equals(rePassword)) {
                // 两次输入密码一致,密码正确
                // 将密码赋值给当前账户
                account.setPassword(password);
                // 退出循环
                break;
            } else {
                System.out.println("错误:两次输入的密码不一致,请重新输入");
            }
            //
            if (num == 3) {
                System.out.println("错误:密码错误次数已达上限,请重新开户");
                showMenu();
                break;
            }
        }
        System.out.print("请输入您的身份证号码:");
        account.setPersonId(sc.next());
        System.out.print("请绑定您的手机号码:");
        account.setPhone(sc.next());
        // 对于账户余额而言,所有新开户的账户其余额都为0
        account.setBalance(0.0);
        // 对于信用额度,只有信用账户与贷款的信用账户才需要
        // 判断当前账户是否属于信用账户或者贷款的信用账户
        // CreditAccount a1 = new CreditAccount();
        // CreditAccount a2 = new LoanCreditAccount();
        //判断account是否为CreditAccount类或者其子类
        if (account instanceof CreditAccount) {
            System.out.print("请输入您申请的信用额度:");
            //强转
            CreditAccount creditAccount = (CreditAccount) account;
            //调用输入的信用额度，到信用账户中
            creditAccount.setLimit(sc.nextDouble());
        }

        // 当所有信息全部填写完成之后,调用银行提供的开户功能进行开户
        if (Bank.register(account)) {
            System.out.println("提示:恭喜您,开户成功,您的卡号为:" + account.getId());
        } else {
            System.out.println("错误:对不起,开户失败!");
        }

        // 当开户成功之后回到入口程序主菜单,继续选择其他服务
        showMenu();
    }

    public void login() {
        System.out.print("请输入卡号:");
        int id = sc.nextInt();
        System.out.print("请输入密码:");
        String password = sc.next();

        // 根据银行Bank提供的登录方法判断当前输入的卡号与密码是否正确
        Account account = Bank.login(id, password);
        if (account == null) {
            // 如果返回值为null,说明卡号或者密码有误
            System.out.println("错误:卡号或密码有误!");
            showMenu();
        } else {
            // 否则,登录成功,进入到银行主菜单
            System.out.println("提示:恭喜您,登录成功!");
            // 由于用户登录成功之后进入的主菜单只能操作自己的账户
            // 因此,必须将此处登录的账户信息传递到银行主菜单
            // 且如果没有传递,则无法访问银行主菜单
            // 要求创建银行主菜单对象的时候必须传递账户信息,否则无法创建
            new BankMenu(account).showMenu();
        }

    }

}